package Level03;

import java.lang.management.LockInfo;
import java.util.concurrent.locks.LockSupport;

/**
 * 编写多线程同步程序，模拟 3 个人排除买票，张某、李某和赵某买电影票，售票员只有
 * 3 张五元的钱，电影票 5 元一张。张某拿 20 元一张的 RMB 排在李某的前面，李某排在
 * 赵某的前面拿一张 10 元的 RMB 买票，赵某拿一张 5 元的 RMB 买票。
 */
public class Ticket implements Runnable {
    //用静态变量定义收银员手中的三种零钱，不会出现，new三个实例会有三个独立的零钱
    private static int small = 3;
    private static int middle = 0;
    private static int height = 0;
    //定义一个变量用来接收买票的钱
    int money;

    public Ticket(int money) {
        this.money = money;
    }

    //
    @Override
    //run方法无法传参数，定义一个其他方法接收参数
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "正在购票");
            change(money);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    void change(Integer money) throws InterruptedException {
        synchronized (Ticket.class) {
            switch (money) {
                case 5:
                    System.out.println("(5)购票成功");
                    small++;
                    break;
                case 10:
                    while (small < 1) {
                        System.out.println("(10)无法找零，请等待;5元剩余" + small);
                        Ticket.class.wait();
                    }
                    System.out.println("(10)购票成功");
                    middle++;
                    small--;
                    break;
                case 20:
                    while (small < 3) {
                        System.out.println("(20)无法找零，请等待;5元剩余" + small);
                        Ticket.class.wait();
                    }
                    System.out.println("(20)购票成功");
                    height++;
                    small -= 3;
                    break;
            }
            Ticket.class.notifyAll();
        }
    }
}
